#include "std_shared_ptr.h"

int std_shared_ptr() {
    //! 1. shared_ptr的初始化
    std::shared_ptr<int> p1(new int(1));      
    std::shared_ptr<int> p2(p1);              // 拷贝构造函数
    std::shared_ptr<int> p3 = p1;             // 赋值构造函数
    std::cout << p3.use_count() << std::endl; // 3:  p1, p2, p3
    std::shared_ptr<int> p4;
    p4.reset(new int(1));
    std::shared_ptr<int> p5 = std::move(p1);  // 移动构造函数
    std::cout << p5.use_count() << std::endl; // 3: p2, p3, p5
    // std::shared_ptr<int> p = new int(1);   //! Error

    //! 2. 获取原始指针
    int* p = p5.get();                        // TODO: 不要删除p指针

    //! 3. 指定删除器
    std::shared_ptr<int> p6(new int(1), shared_ptr_func_deleter<int>);
    std::shared_ptr<int> p7(new int(1), shared_ptr_struct_deleter<int>());
    std::shared_ptr<int> p8(new int(1),  [](int* p) { delete p;});
    std::shared_ptr<int> p9(new int[10], [](int* p) { delete[] p;});   //! 输出指针的删除器

    //! 4.不要用一个原始指针初始化多个智能指针
    int* ptr = new int;
    std::shared_ptr<int> p10(ptr);
    // std::shared_ptr<int> p11(ptr);                                  //! Notice: double free

    //! 5. 避免循环引用

    return 0;
}